package com.jh.fcsm.util.word;

import org.apache.poi.ooxml.POIXMLDocument;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

public class Word {

    /**
     * 进行文字替换
     *
     * @param param    需要替换的参数
     * @param template 模板
     */
    public static XWPFDocument generateWord(Map<String, Object> param, String template) throws Exception {
        CustomXWPFDocument doc = null;
        //通过路径获取word模板
        try(OPCPackage pack = POIXMLDocument.openPackage(template)){
            doc = new CustomXWPFDocument(pack);
            //通过InputStream 获取模板，此方法适用于jar包部署
            //  doc = new CustomXWPFDocument(template);
            if (param != null && param.size() > 0) {
                //处理段落
                WordParagraphsUtils.replaceInAllParagraphs(doc.getParagraphs(), param);
                //处理表格
                WordTablesUtils.replaceInTables(doc.getTables(), param);
            }
        } catch (Exception e) {
            throw e;
        }
        return doc;
    }

    public static void main(String[] args) {
//    	Map<String, Object> contentparam = new HashMap<String, Object>();
//    	contentparam.put("${taitou}", "抬头方大检测中心");
//    	contentparam.put("${testNo}", "检号");
//		contentparam.put("${queryNo}", "委托号");
//		contentparam.put("${queryPassword}","查询密码");
//		contentparam.put("${protocolName}", "委托客户名称");
//		contentparam.put("${customerLinkMan}", "委托客户联系人");
//		contentparam.put("${customerAddress}", "联络信息");
//		contentparam.put("${customerLinkTel}", "委托客户联系电话");
//		contentparam.put("${sampleName}", "样品总称");
//		contentparam.put("${model}", "型号规格");
//		contentparam.put("${sampleBank}", "样品商标");
//		contentparam.put("${sampleClass}", "样品等级");
//		contentparam.put("${sampleProductionDate}", "样品生产日期");
//		contentparam.put("${productNo}", "批号或编号");
//		contentparam.put("${sampleProductionUnit}", "生产单位");
//		contentparam.put("${examinedUnit}", "受检单位");
//		contentparam.put("${sampleDeliveryUnit}", "送样单位");
//		contentparam.put("${toSampleDate}", "到样日期");
//		contentparam.put("${toSampleQuantity}", "到样数量");
//		contentparam.put("${samplesdescription}", "样品状态描述");
//		contentparam.put("${sampleStorage}", "样品贮存要求");
//		contentparam.put("${sampleBack}", "检毕样品退送方式");
//		contentparam.put("${sampleSecrecy}", "样品资料保密要求");
//		contentparam.put("${reportUse}", "报告用途");
//		contentparam.put("${reportExtract}", "检测报告提取方式");
//		contentparam.put("${reportQuantity}", "报告数量");
//		contentparam.put("${smsNotification}", "是否短信通知");
//		contentparam.put("${notificationPhone}", "短信通知手机号");
//		contentparam.put("${receivingAddr}", "邮寄地址");
//		contentparam.put("${receivingName}", "收件人");
//		contentparam.put("${receivingTel}", "收件人联系电话");
//		contentparam.put("${standardName}", "判定依据QB/T 1615-2006《皮革服装》；GB 20400-2006《皮革和毛皮 有害物质限量》；QB/T 1872-2004《服装用皮革》");
//		contentparam.put("${testBasis}", "检测依据■CMA ■CAL □CMAF ■CNAS");
//		contentparam.put("${testMethodOther}", "检测依据FZ/T 01057.2-2007《纺织纤维鉴别试验方法 第2部分：燃烧法》、FZ/T 01057.3-2007《纺织纤维鉴别试验方法 第3部分：显微镜法》、FZ/T 01057.4-2007《纺织纤维鉴别试验方法 第4部分：溶解法》 \n" +
//				"GB 20400-2006 《皮革和毛皮 有害物质限量》\n" +
//				"ISO 17131:2012 《皮革 皮革的显微镜鉴别》、ZJ.FY/FB PG02-2013《皮革 材质鉴别：显微镜法》\n" +
//				"QB/T 1615-2006 《皮革服装》\n" +
//				"QB/T 1872-2004 《服装用皮革》\n" +
//				"");
//		contentparam.put("${chkitem}", "(样品1：皮革服装):号型;【部位用料】:领面、前身前面、后身后面、袖面、袖底、里料、腰头、腰带及小料、基本要求;【辅料和配件】:纺织品、毛皮、配件、拉链、钮扣、缝线、商标;【缝制要求】:针距、针迹、缝纫表面、扣眼;【外观质量】:领子、肩、袖、门襟里襟、背叉摆叉、底边、口袋、扣眼、袢、腰头、前后裆、串带、裤腿、夹里、整体要求;纤维含量\n" +
//				"(样品2：皮革原料):可分解有害芳香胺染料;【游离甲醛】:游离甲醛（分光光度法）;撕裂力;材质鉴别\n" +
//				"");
//		contentparam.put("${subPackage}", "辅检或分包安排");
//		contentparam.put("${testResultReq}", "结果出具形式");
//		contentparam.put("${reportConclusionForm}", "检测报告结论形式");
//		contentparam.put("${allFee}", "检测收费");
//		contentparam.put("${completeDate}", "检测完成日期");
//		contentparam.put("${testRemark}", "备注");
//		contentparam.put("${testerDate}", "承检方代表签名日期");
//		contentparam.put("${weituoDate}", "委托方代表签名日期");
//
//
//		String qianming="H:\\test\\word\\qm.jpg";
//        Map<String,Object> testerSignature=new HashMap<String, Object>();
//        testerSignature.put("width", "55");
//        testerSignature.put("height", "20");
//        testerSignature.put("type", "jpg");
//        testerSignature.put("content", qianming);
//		contentparam.put("${testerSignature}", testerSignature);
//		String fileName = "H:\\test\\word\\contenttest1.docx";
//        String file = "D:\\test.docx";
//
//        Map<String, Object> map = new HashMap<>();
//        String img = "D:\\123.png";
//        Map<String, Object> testerSignature = new HashMap<String, Object>();
//        testerSignature.put("width", "120");
//        testerSignature.put("height", "120");
//        testerSignature.put("type", "png");
//        testerSignature.put("content", img);
//        testerSignature.put("isfloat", "1");
//        testerSignature.put("leftOffset", "250");
//        testerSignature.put("topOffset", "10");
//        testerSignature.put("behind", "0");
//        map.put("${AMP}", testerSignature);
//        try {
//            // 模板文件
//            XWPFDocument doc = Word.generateWord(map, file);
//            // 输出文件
//
//            String f = "D:\\testff222.docx";
//            System.out.println(f);
//            OutputStream outputStream = new FileOutputStream(f);
//            doc.write(outputStream);
//            outputStream.close();
//            String fpdf = "H:\\test\\word\\22222.pdf";
//            Map<String, String> params=new HashMap<String, String>();
//            params.put("结果出具形式", "bbbbbbbbbb");
//            word2Pdf(new FileInputStream(f), new FileOutputStream(fpdf),params);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
    }
//
//    private static void word2Pdf(InputStream source, OutputStream target, Map<String, String> params) throws Exception {
//    	 PdfOptions options = PdfOptions.create().fontProvider(new IFontProvider() {
//
//			@Override
//			public Font getFont(String familyName, String encoding, float size, int style, Color color) {
//				BaseFont bf = null;
//				 File docxFile = new File("D:\\home\\app\\fd\\backup\\template\\font\\simsun.ttc");//main函数测试用
//	                try {
//						bf = BaseFont.createFont(docxFile.getPath() + ",1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
//					} catch (Exception e) {
//						e.printStackTrace();
//					}
//
//	                Font font = new Font(bf, size, style, color);
//	                font.setColor(color);
//	                return font;
//			}
//		});
//         wordConverterToPdf(source, target, options,params);
//    }
//    /**
//     * 将word文档， 转换成pdf, 中间替换掉变量
//     * @param source 源为word文档， 必须为docx文档
//     * @param target 目标输出
//     * @param params 需要替换的变量
//     * @param options PdfOptions.create().fontEncoding( "windows-1250" ) 或者其他
//     * @throws Exception
//     */
//    public static void wordConverterToPdf(InputStream source, OutputStream target, PdfOptions options, Map<String, String> params) throws Exception {
//
//        ZipSecureFile.setMinInflateRatio(-1.0d);//FZY增加
//        XWPFDocument doc = new XWPFDocument(source);
//        paragraphReplace(doc.getParagraphs(), params);
//        for (XWPFTable table : doc.getTables()) {
//            for (XWPFTableRow row : table.getRows()) {
//                for (XWPFTableCell cell : row.getTableCells()) {
//                    paragraphReplace(cell.getParagraphs(), params);
//                }
//            }
//        }
//        PdfConverter.getInstance().convert(doc, target, options);
//        doc.close();
//    }
//
//    /** 替换段落中内容 */
//    private static void paragraphReplace(List<XWPFParagraph> paragraphs, Map<String, String> params) {
//        if (params != null && params.size() > 0) {
//            for (XWPFParagraph p : paragraphs) {
//                for (XWPFRun r : p.getRuns()) {
//                    String content = r.getText(r.getTextPosition());
//
//                    if ((content != null && !"".equals(content)) && params.containsKey(content)) {
//                        r.setText(params.get(content), 0);
//                    }
//                }
//            }
//        }
//    }
}